Next.js একটি আধুনিক ফ্রেমওয়ার্ক, যা বিভিন্ন ধরনের অ্যাপ্লিকেশন তৈরি করার জন্য খুবই কার্যকরী। এর মধ্যে Authentication বা ব্যবহারকারীর পরিচয় যাচাই একটি গুরুত্বপূর্ণ বিষয়। Next.js এ Middleware ব্যবহারের মাধ্যমে আপনি সিকিউরিটি, অথেন্টিকেশন, এবং অথোরাইজেশন খুব সহজে ম্যানেজ করতে পারেন।
নিচে Next.js এ Authentication Middleware তৈরি এবং ব্যবহারের জন্য কিছু Best Practices দেওয়া হলো।
১. Middleware ব্যবহার করা
Next.js 12 এর পর Middleware ফিচারটি চালু করা হয়, যা অ্যাপ্লিকেশন রিকোয়েস্টের আগে বা পরে সার্ভারের উপর কিছু কাজ করতে সাহায্য করে। Middleware ব্যবহার করে আপনি অ্যাপ্লিকেশন রিকোয়েস্টের জন্য ব্যবহারকারী অথেন্টিকেশন যাচাই করতে পারেন। এটি সাধারনত সেশন বা টোকেন ভিত্তিক অথেন্টিকেশন প্রক্রিয়া সম্পাদন করতে ব্যবহৃত হয়।
উদাহরণ: Middleware সেটআপ
Next.js এর মেইন middleware.js ফাইলের মাধ্যমে অ্যাপ্লিকেশনটির রিকোয়েস্ট ট্র্যাক এবং প্রক্রিয়া করতে পারেন।
// middleware.js
import { NextResponse } from 'next/server';
import jwt from 'jsonwebtoken';
export function middleware(req) {
// JWT টোকেন চেক করুন
const token = req.cookies.get('auth_token');
if (!token) {
// যদি টোকেন না থাকে, তবে রিডিরেক্ট করুন
return NextResponse.redirect(new URL('/login', req.url));
}
try {
// টোকেন ভ্যালিডেশন
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// টোকেন সঠিক হলে, রিকোয়েস্ট প্রসেস করতে দিন
req.user = decoded; // ইউজারের ডেটা রিকোয়েস্টে যুক্ত করা হচ্ছে
return NextResponse.next();
} catch (error) {
// টোকেন যদি অবৈধ হয়, রিডিরেক্ট করুন
return NextResponse.redirect(new URL('/login', req.url));
}
}
ব্যাখ্যা:
req.cookies.get('auth_token'): এখানে আমরা ইউজারের কুকি থেকে JWT টোকেন নিয়ে যাচাই করছি।jwt.verify(): এই ফাংশনটি JWT টোকেনকে ভ্যালিডেট করে।NextResponse.redirect(): যদি টোকেন না থাকে বা ভুল হয়, তাহলে ইউজারকে লগইন পেজে রিডিরেক্ট করা হয়।NextResponse.next(): যদি টোকেন সঠিক হয়, তাহলে রিকোয়েস্ট পরবর্তী ধাপে পাঠানো হয়।
২. Token-based Authentication ব্যবহার করা
Token-based authentication (বিশেষ করে JWT - JSON Web Tokens) বর্তমানে খুবই জনপ্রিয় এবং নিরাপদ। Middleware এর মাধ্যমে আপনি সহজে ইউজারের অথেন্টিকেশন যাচাই করতে পারেন এবং টোকেন ব্যবহারের মাধ্যমে সেশন স্টোর না করে স্টেটলেস অথেন্টিকেশন পরিচালনা করতে পারেন।
JWT টোকেন তৈরির উদাহরণ:
import jwt from 'jsonwebtoken';
const createToken = (user) => {
return jwt.sign({ id: user.id, email: user.email }, process.env.JWT_SECRET, {
expiresIn: '1h', // 1 ঘণ্টা পর টোকেন মেয়াদোত্তীর্ণ হবে
});
};
এখানে আমরা একটি টোকেন তৈরি করছি যেটি ইউজারের আইডি এবং ইমেইল সহ একটি সিক্রেট কী ব্যবহার করে JWT টোকেন জেনারেট করছে। এটি হ্যাশড থাকে এবং ১ ঘণ্টা পর মেয়াদ শেষ হবে।
৩. Authentication জন্য Cookie ব্যবহারের Best Practices
Next.js অ্যাপ্লিকেশনে নিরাপদ অথেন্টিকেশন প্রক্রিয়া পরিচালনার জন্য HTTP-only cookies ব্যবহৃত হয়। এই কুকিগুলি ক্লায়েন্ট সাইড স্ক্রিপ্ট থেকে অ্যাক্সেসযোগ্য হয় না, যা নিরাপত্তার জন্য গুরুত্বপূর্ণ।
উদাহরণ: HTTP-only Cookie সেট করা
import { serialize } from 'cookie';
export function setTokenCookie(res, token) {
const cookie = serialize('auth_token', token, {
httpOnly: true, // শুধুমাত্র সার্ভারের মাধ্যমে অ্যাক্সেসযোগ্য
secure: process.env.NODE_ENV === 'production', // প্রোডাকশন এনভায়রনমেন্টে Secure চেক
maxAge: 60 * 60 * 1, // 1 ঘণ্টা টোকেনের মেয়াদ
path: '/', // গোটা সাইটের জন্য পাথ
});
res.setHeader('Set-Cookie', cookie);
}
ব্যাখ্যা:
httpOnly: true: কুকি সার্ভারের বাইরে অ্যাক্সেসযোগ্য হবে না (JavaScript থেকে এটি অ্যাক্সেস করা যাবে না)।secure: true: প্রোডাকশন এনভায়রনমেন্টে কুকি শুধুমাত্র HTTPS এর মাধ্যমে ট্রান্সফার হবে।maxAge: 60 * 60 * 1: টোকেনের মেয়াদ ১ ঘণ্টা নির্ধারণ করা হয়েছে।
৪. Authorized Routes এবং Role-based Access Control
Next.js এ বিভিন্ন রোল বা পারমিশন ভিত্তিক অ্যাক্সেস কন্ট্রোল পরিচালনা করা গুরুত্বপূর্ণ। আপনি Middleware ব্যবহার করে নির্দিষ্ট রোলের জন্য অথেন্টিকেশন চেক করতে পারেন।
উদাহরণ: রোল-বেসড অ্যাক্সেস
// middleware.js
export function middleware(req) {
const token = req.cookies.get('auth_token');
if (!token) {
return NextResponse.redirect(new URL('/login', req.url));
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// রোল চেক করা
if (decoded.role !== 'admin') {
return NextResponse.redirect(new URL('/unauthorized', req.url));
}
req.user = decoded;
return NextResponse.next();
} catch (error) {
return NextResponse.redirect(new URL('/login', req.url));
}
}
ব্যাখ্যা:
decoded.role !== 'admin': এখানে আমরা চেক করছি যে ইউজারের রোল অ্যাডমিন না হলে তাকে অনুমতি দেওয়া হবে না।NextResponse.redirect('/unauthorized'): ইউজার যদি অরডিনারি রোলের হয়, তবে তাকে অনুমতি না দিয়ে "Unauthorized" পেজে রিডিরেক্ট করা হয়।
৫. Authentication Error Handling
Authentication Middleware ব্যবহারের সময় যথাযথ এরর হ্যান্ডলিং করা খুবই গুরুত্বপূর্ণ। যেমন, যদি কোনো ইউজারের টোকেন মেয়াদ শেষ হয়ে যায়, তখন তাকে লগইন পেজে রিডিরেক্ট করতে হবে এবং একটি ক্লিয়ার এরর মেসেজ দেখানো উচিত।
উদাহরণ: Error Handling
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
} catch (error) {
console.error("Authentication Error: ", error);
return NextResponse.redirect(new URL('/login', req.url));
}
ব্যাখ্যা:
console.error: সঠিক লগিং এর মাধ্যমে যে কোনো সমস্যা ট্র্যাক করা সহজ হবে।NextResponse.redirect('/login'): ইউজারের টোকেন অবৈধ বা মেয়াদ শেষ হলে লগইন পেজে রিডিরেক্ট করা হচ্ছে।
সারাংশ
Next.js এ Authentication Middleware তৈরি করার জন্য এই best practices গুলি মেনে চললে, আপনি একটি নিরাপদ এবং স্কেলেবল অথেন্টিকেশন সিস্টেম তৈরি করতে পারবেন। এখানে উল্লেখিত টোকেন, কুকি, রোল-বেসড অ্যাক্সেস কন্ট্রোল এবং এরর হ্যান্ডলিং এর মতো স্ট্রাটেজিগুলি আপনার অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করবে।
Read more